cmake_minimum_required(VERSION 3.23)
project(functions VERSION 1.0 LANGUAGES C CXX)

include(cmake/test.cmake)

set(var1 hello)
set(var2 world)

#scope和block的方式类似
function(printme arg1 arg2 arg3)
    message("arg1: ${arg1}")
    message("arg2: ${arg2}")
    if(DEFINED arg3)
        message("args is defined ...")
    endif()
endfunction()
# 函数的参数是常量值
# printme(${var1} ${var2} var3) 


#ARGC:  有名参数和无名参数的总数量
#ARGV:  有名参数和无名参数组成的列表
#ARGN:  无名参数列表
function(fargs arg1 arg2)
    message("ARGC: ${ARGC}")
    message("ARGV: ${ARGV}")
    message("ARGN: ${ARGN}")
endfunction()
# fargs(hello world ni hao)


#cmake_parse_arguments(prefix 
#                      valuelessKeywords singleValueKeywords multiValueKeywords
#                      argsToParse...)
#   结果变量：${prefix}_${value}
#   valuelessKeywords中值都会被定义变量
#   singleValueKeywords和multiValueKeywords中的值存在且后面跟随相应的值，才会定义相应变量
#
function(func)
    set(prefix ARG)
    set(noValues ENABLE_COMPILE ENABLE_LINK)
    set(singleValues TARGET)
    set(multiValues SOURCE LIBRARY OTHER)

    cmake_parse_arguments(
        ${prefix}
        "${noValues}" "${singleValues}" "${multiValues}"
        ${ARGV}
    )

    message("Option summary:")

    #valuelessKeywords
    #相应的变量一定会被定义：存在定义为TRUE,不存在定义为FALSE
    foreach(arg IN LISTS noValues)
        if(${prefix}_${arg})
            message(" ${arg} enabled")
        else()
            message(" ${arg} disabled")
        endif()
    endforeach()

    foreach(arg IN LISTS singleValues multiValues)
        if(NOT DEFINED ${prefix}_${arg})
            message(" ${prefix}_${arg} is not defined ...")
        endif()
        message(" ${arg} = ${${prefix}_${arg}}")
    endforeach()
endfunction()

# func(SOURCE a.cpp b.cpp
#      TARGET main
#      LIBRARY liba libc
#      ENABLE_COMPILE
#      OTHER
# )

# <prefix>_UNPARSED_ARGUMENTS:       没有匹配任何关键字的剩余参数
# <prefix>_KEYWORDS_MISSING_VALUES： 没有匹配参数的关键字(关键字出现且后面没有更随参数)

function(fun1)
    set(prefix ARG)
    set(singleValueKeywords TARGET)
    set(multiValueKeywords SOURCE LIBRARY)

    cmake_parse_arguments(
        PARSE_ARGV 0
        ${prefix}
        "" "${singleValueKeywords}" "${multiValueKeywords}"
    )

    #这些参数出现在函数的参数列表中，但是没有匹配到任意一个关键字
    message("leftover arguments: ${${prefix}_UNPARSED_ARGUMENTS}")
    foreach(arg IN LISTS ${prefix}_UNPARSED_ARGUMENTS)
        message("${arg}")
    endforeach()

    #关键字出现在函数中，但是后面没有跟随相应的参数
    message("keywords missing values: ${${prefix}_KEYWORDS_MISSING_VALUES}")
endfunction()

# fun1("hello;world"
#      TARGET MAIN
#      SOURCE a.cpp b.cpp
#      LIBRARY
# )









